home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Games / NeXTGo / Source / genmove.c < prev    next >
C/C++ Source or Header  |  1993-02-08  |  2KB  |  110 lines

  1. #include "comment.header"
  2.   
  3. #define EMPTY 0
  4. #define MAXTRY 400
  5. #define BLACKSTONE 2
  6.  
  7. extern unsigned char p[19][19];
  8. extern int currentStone, opposingStone, MAXX, MAXY;
  9. extern int rd, lib, blackPassed, whitePassed;
  10. extern void eval(int);
  11. extern int findwinner(int*,int*,int*);
  12. extern int findsaver(int*,int*,int*);
  13. extern int findpatn(int*,int*,int*);
  14. extern void countlib(int,int,int);
  15. extern int fioe(int,int);
  16. extern void Random(int*);
  17.  
  18. void genmove(int *i, int *j)
  19.      /* generate computer move */
  20. {
  21.   int ti, tj, tval;
  22.   int val;
  23.   int try = 0;   /* number of try */
  24.   
  25.   /* initialize move and value */
  26.   *i = -1;  *j = -1;  val = -1;
  27.   
  28.   /* re-evaluate liberty of opponent pieces */
  29.   eval(opposingStone);
  30.   
  31.   /* find opponent piece to capture or attack */
  32.   if (findwinner(&ti, &tj, &tval))
  33.     if (tval > val)
  34.       {
  35.     val = tval;
  36.     *i = ti;
  37.     *j = tj;
  38.       }
  39.   
  40.   /* save any piece if threaten */
  41.   if (findsaver(&ti, &tj, &tval))
  42.     if (tval > val)
  43.       {
  44.     val = tval;
  45.     *i = ti;
  46.     *j = tj;
  47.       }
  48.   
  49.   /* try match local play pattern for new move */
  50.   if (findpatn(&ti, &tj, &tval))
  51.     if (tval > val)
  52.       {
  53.     val = tval;
  54.     *i = ti;
  55.     *j = tj;
  56.       }
  57.   
  58.   /* no urgent move then do random move */
  59.   if (val < 0)
  60.     do {
  61.       Random(&rd);
  62.       *i = rd % MAXX;
  63.       /* avoid low line  and center region */
  64.       if ((*i < 2) || (*i > MAXX - 3) || ((*i > (MAXX/2) - 2) && (*i < (MAXX/2) + 2)))
  65.     {
  66.       Random(&rd);
  67.       *i = rd % MAXX;
  68.       if ((*i < 2) || (*i > MAXX - 3))
  69.         {
  70.           Random(&rd);
  71.           *i = rd % MAXX;
  72.         }
  73.     }
  74.       Random(&rd);
  75.       *j = rd % MAXY;
  76.       /* avoid low line and center region */
  77.       if ((*j < 2) || (*j > MAXY - 3) || ((*j > (MAXX/2) - 2) && (*j < (MAXY/2) + 2)))
  78.     {
  79.       Random(&rd);
  80.       *j = rd % MAXY;
  81.       if ((*j < 2) || (*j > MAXY - 3))
  82.         {
  83.           Random(&rd);
  84.           *j = rd % MAXY;
  85.         }
  86.     }
  87.       lib = 0;
  88.       countlib(*i, *j, currentStone);
  89.     }
  90.   /* avoid illegal move, liberty one or suicide, fill in own eye */
  91.   while ((++try < MAXTRY)
  92.      && ((p[*i][*j] != EMPTY) || (lib < 3) || fioe(*i, *j)));
  93.   
  94.   if (try >= MAXTRY)  /* computer pass */
  95.     {
  96.       if (currentStone == BLACKSTONE)
  97.     blackPassed = 1;
  98.       else
  99.     whitePassed = 1;
  100.       *i = *j = -1;
  101.     }
  102.   else   /* find valid move */
  103.     {
  104.       if (currentStone == BLACKSTONE)
  105.     blackPassed = 0;
  106.       else
  107.     whitePassed = 0;
  108.     }
  109. }  /* end genmove */
  110.